MZR 俺はインターネットの一員になるんだ!

概要

「俺はインターネットの一員になるんだ!」
そう決心した黒羽くんはAS番号を取得し、とある組織にトランジット提供を依頼した。
トランジット先とは、IPv6閉域網の網内折り返し通信を用いてトンネル接続を行い、トンネル内でBGP接続を行うこととなった。

黒羽くんは熱意が冷めないうちに早速トンネル接続の設定を行い、トランジット先の対向ルーターとの疎通が確認できた。
「俺ももうすぐインターネットの一員だ!」
さらに意気込んだ黒羽くんは続けてBGPの設定を行った。

「俺もこれでインターネットの一員になったんだ」と、黒羽くんは感慨に浸っている。
黒羽くんは最後に接続確認を行った。
「あれ?インターネットに接続できない… しかも、いつの間にか対向ルーターまでpingが通らなくなってる…」
黒羽くんは塞ぎ込んでしまった。
相談に乗ろうにも、ルーターのログイン情報以外については「いい感じに調べて」としか言ってくれない。
なんとかして接続の問題を解消してほしい。

前提条件

  • 障害発生までの経緯は概要のとおり
  • 操作可能な端末はPCとRouterの2つである
  • Routerで適切な設定を行うことで本トラブルは解決する
  • 対向ルーターとの接続に用いるIPv6閉域網では障害は発生していない
  • 対向ルーターは適切に設定されている

制約

  • 以下の情報は既存の設定に従う
    • BGPで広報する経路
    • BGPで受信する経路
    • その他接続に必要な情報
  • スタティックルートを新たに設定してはならない

初期状態

  • 対向ルーターのトンネル終端アドレスとpingによる通信ができない
  • トンネル内で対向ルーターとpingによる通信ができない
  • PC, Routerから198.51.100.1 とpingによる通信ができない
  • PC, Routerから2001:db8:2718:2818::1 とpingによる通信ができない

終了状態

  • 対向ルーターとの BGP stateEstablished となっている
  • 対向ルーターから経路を受け取っている
  • 対向ルーターのトンネル終端アドレスとpingによる通信ができる
  • トンネル内で対向ルーターとpingによる通信ができる
  • PC, Routerから198.51.100.1 とpingによる通信ができる
  • PC, Routerから2001:db8:2718:2818::1 とpingによる通信ができる

解説

IPv6トンネルを用いてBGP接続を行うとき、BGPで受け取った経路に対向のトンネル終端アドレスが含まれていた場合、「トンネル接続自体の通信がトンネル内を経由する」という経路となりトンネル接続が維持できなくなるという問題です。
show log コマンドを実行したときに kernel: ip6_tunnel: tun1: Local routing loop detected! というログが大量に出力されていることから気付いた方もおられました。

この問題では一般には2つの解決方法が考えられます。
1つ目の解決方法は、対向のトンネル終端アドレスに対するスタティックルートを設定することです。
2つ目の解決方法は、VRFを設定することで、トンネル接続自体に用いるルーティングテーブルとBGP接続により受け取った経路を適用するルーティングテーブルを分離するものです。
ルーティングテーブルを分離した場合、トンネルインターフェースとBGPルーターの下流へのインターフェースに同じVRFを適用することになります。

しかし、この問題の前提条件にて「スタティックルートを新たに設定してはならない」というものがありますので、この問題では先程述べた1つ目の解決方法は不適切であり、2つ目の解決方法を用いる必要があります。

想定していた解法

今回の問題では、トンネルインターフェース tun1 にVRFを設定し、当該VRFに既存のBGP設定を移行することになります。
また、広報している下流ネットワークが eth2 に繋がっているため、eth2 にもVRFを設定する必要があります。

なお、終了条件に「トンネル内で対向ルーターとpingによる疎通ができる」とありますが、ping 192.0.2.0ping 2001:db8:face::1 というコマンドでは疎通確認ができません。
この通信は ping 192.0.2.0 vrf <VRF名>ping 2001:db8:face::1 vrf <VRF名> というコマンドを実行することで満たしていることを確認できます。

採点基準

  • ping コマンドで以下のアドレスへ通信できる
    • ping コマンドであれば、別途引数を用いても可
    • Routerから全て通信できれば100点、一部であれば30点を付与する
    • PCから全て通信できれば追加で50点を付与する
    • アドレス
      • 2001:db8:cafe:f00d::beef
      • 192.0.2.0
      • 2001:db8:face:babe::1
      • 198.51.100.1
  • Routerにて、BGPにより経路が受信できている
    • 全て受信できれば100点、一部であれば30点を付与する
    • 経路表
      • sh ip route vrf all bgp
        • B>* 0.0.0.0/0 [20/0] via 192.0.2.0, tun1, weight 1, 00:04:10
        • B>* 192.0.2.0/24 [20/0] via 192.0.2.0, tun1, weight 1, 00:04:10
        • B>* 198.51.100.0/24 [20/0] via 192.0.2.0, tun1, weight 1, 00:04:10
      • sh ipv6 route vrf all bgp
        • B>* ::/0 [20/0] via fe80::f15e:baff:fef9:652a, tun1, weight 1, 00:05:47
        • B>* 2001:db8:2718::/48 [20/0] via fe80::f15e:baff:fef9:652a, tun1, weight 1, 00:05:47
        • B>* 2001:db8:cafe::/48 [20/0] via fe80::f15e:baff:fef9:652a, tun1, weight 1, 00:05:47
        • B>* 2001:db8:face::/48 [20/0] via fe80::f15e:baff:fef9:652a, tun1, weight 1, 00:05:47
  • BGPで広報する経路を変更した
    • 50点減点
  • スタティックルートを追加した
    • 0点

講評

この問題は、ダイナミックルーティングとトンネル接続を組み合わせた際に発生する問題を取り扱ったものです。
この問題で用いている、BGP, GRE, VRFという技術は、何れもある程度発展的なネットワーク知識を要求するもので、実際にネットワーク運用を行った経験がないと難しい問題となったなと感じています。
実際、この問題で満点解答を提出したチームは、全問題完答した2チームのみであったため、かなり難しい問題となったようです。

模範解答

この問題は次のようにコンフィグを変更することで解決することができます。
(作業の順番によっては protocol bgp ごと削除することも可能です。)

この問題は作問者が実際に経験したトラブルを基に作問しました。
同じ状況に遭遇した場合、この解決方法が適用できるかもしれません。

 interfaces {
     ethernet eth0 {
         address 192.168.3.1/24
         hw-id 9c:a3:ba:32:94:96
     }
     ethernet eth1 {
         address 2001:db8:cafe:babe::beef/64
         hw-id 9c:a3:ba:32:ac:a2
     }
     ethernet eth2 {
         address 203.0.113.1/24
         address 2001:db8:314:1592::1/64
         hw-id 9c:a3:ba:32:6f:a5
+        vrf bgp
     }
     loopback lo {
     }
     tunnel tun1 {
         address 192.0.2.1/31
         address 2001:db8:face:babe::ffff/64
         encapsulation ip6gre
         remote 2001:db8:cafe:f00d::beef
         source-address 2001:db8:cafe:babe::beef
+        vrf bgp
     }
 }
 protocols {
     bgp {
-        address-family {
-            ipv4-unicast {
-                network 203.0.113.0/24 {
-                }
-            }
-            ipv6-unicast {
-                network 2001:db8:314:1500::/56 {
-                }
-            }
-        }
-        neighbor 192.0.2.0 {
-            address-family {
-                ipv4-unicast {
-                }
-            }
-            remote-as 64512
-        }
-        neighbor 2001:db8:face:babe::1 {
-            address-family {
-                ipv6-unicast {
-                }
-            }
-            remote-as 64512
-        }
         system-as 65280
     }
     static {
         route 192.168.0.0/16 {
             next-hop 192.168.3.254 {
             }
         }
         route6 ::/0 {
             next-hop 2001:db8:cafe:babe::1 {
             }
         }
     }
 }
 service {
     (略)
 }
 system {
     (略)
 }
+vrf {
+    name bgp {
+        protocols {
+            bgp {
+                address-family {
+                    ipv4-unicast {
+                        network 203.0.113.0/24 {
+                        }
+                    }
+                    ipv6-unicast {
+                        network 2001:db8:314:1500::/56 {
+                        }
+                    }
+                }
+                neighbor 192.0.2.0 {
+                    address-family {
+                        ipv4-unicast {
+                        }
+                    }
+                    remote-as 64512
+                }
+                neighbor 2001:db8:face:babe::1 {
+                    address-family {
+                        ipv6-unicast {
+                        }
+                    }
+                    remote-as 64512
+                }
+                system-as 65280
+            }
+        }
+        table 100
+    }
+}